package com.sanbi.common.express.request;

import lombok.Data;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.Max;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.time.LocalDate;
import java.util.List;

/**
 * @title: 创建出库委托
 * @description:
 * @author: wanpeng
 * @create: 2024-05-13 19:20
 * @Version 1.0
 **/
@Data
public class CreateOutboundRequest implements Serializable {
    /** 客户操作账号 */
    private String customer_code;
    /** 客户参考号（订单主键） */
    @NotNull(message = "orderCode isn't null")
    private String ref_no;
    /** 出库仓库代码（详细参考公共服务，获取仓库代码） */
    @NotNull
    private String from_warehouse_code;
    /**
     * 委托类型 可选值：<br> S(标准出库); <br>D(下架销毁); <br>R(退仓出库); <br>DS(dropshipping出库); <br>P(FBA Pro); <br>O(其他出库)。
     * <br>*注：如果选择是标准出库，SKU的库存质量只能选择良好。
     */
    @NotNull
    private String consignment_type;
    /** 物流服务信息 */
    @NotNull
    private LogisticsServiceInfo logistics_service_info;
    /** 物流单号。特殊物流产品或特殊客户支持传入;系统不接收非指定客户或物流产品传入。*/
    private String shipping_no;
    /**
     * 服务商标签。特殊物流产品或特殊客户支持传入;系统不接收非指定客户或物流产品传入。
     * <br>*注：只支持PDF格式文件，文件需要转换成Base64编码格式，只支持Base64字符串格式。单个标签文件最大支持1MB。
     */
    private String shippinglabel;
    /**
     * 发票标签。特殊物流产品或特殊客户支持传入;系统不接收非指定客户或物流产品传入。
     * <br>*注：只支持PDF格式文件，文件需要转换成Base64编码格式，只支持Base64字符串格式。单个标签文件最大支持1MB。
     */
    private String invoice;
    /**
     * 	客户自定义标签。特殊物流产品或特殊客户支持传入;系统不接收非指定客户或物流产品传入。
     * 	<br>*注：只支持PDF格式文件，文件需要转换成Base64编码格式，只支持Base64字符串格式。单个标签文件最大支持1MB。
     */
    private String outside_label;
    /**
     * MSDS标签。特殊物流产品或特殊客户支持传入;系统不接收非指定客户或物流产品传入。
     * <br>*注：只支持PDF格式文件，文件需要转换成Base64编码格式，只支持Base64字符串格式。单个标签文件最大支持1MB。
     */
    private String msds;
    /**
     * 	ODA委托单走货标识。<br>可选值：<br>Y(只接收非ODA单)；<br>N(默认都接单)；<br>默认为N。
     */
    private String oda;
    /**
     * 	销售平台。 <br>可选值： <br>AE(速卖通); <br>WS(Wish); <br>EB(eBay); <br>AM(亚马逊); <br>TM(天猫国际); <br>JD(京东)
     */
    private String sales_platform;
    /** 	卖家ID */
    private String seller_id;
    /** 销售/平台交易号 */
    private String sales_no;
    /** 	店铺ID */
    private String shop_id;
    /** 店铺名称 */
    private String shop_name;
    /**
     * 保险服务； <br>可选值： <br>8Y(平邮保价); <br>5Y(挂号-快递保价); <br>5P(0.6%保险);<br>242(0.33%保险);<br>244(尾程增值服务保险)。
     * <br>*注：如果选择8Y,5Y,5P,242保险服务后，insure_value（投保金额）必填;
     * <br>如果选额244保险服务，则insure_value（投保金额）不能填写，244投保金额取订单上SKU的价格或者基础数据SKU的价格进行投保。
     * <br>如果选择8Y(平邮保价)或5Y(挂号-快递保价)，投保金额必须在1.00到100.00之间。
     * <br>如果选择5P(0.6%保险），投保金额必须在200.00到9999999.00之间。
     * <br>如果选择242（0.33%保险）,投保金额必须在2.00RMB-10000RMB之间；
     */
    private String insure_services;
    /** 	投保金额币别，采用国际ISO标准。<br>可选值：<br>USD(美元),<br>CNY(人民币)；<br>人民币只适用于242（0.33% 保险） */
    private String currency;
    /**
     * 投保金额，精确到2位小数。<br>*注：如果选择保险服务后，insure_value（投保金额）必填。
     * <br>如果选择8Y(平邮保价)或5Y(挂号-快递保价)，投保金额必须在1.00到100.00之间。
     * <br>如果选择5P(0.6%保险），投保金额必须在200.00到9999999.00之间。
     * <br>如果是选择242（0.33%保险），投保金额必须在2.00RMB到10000.00RMB之间
     */
    private Double insure_value;
    /** 备注。客户填写的出库委托备注信息 */
    private String remark;
    /** 用于FBA VC客户自提时间 eg:2021-11-29 15:30:00 */
    private LocalDate pick_date;
    /** VC自提服务商名称 */
    private String pickup_vendor;
    /** VC客户 ASN&ARN label */
    private String vcfba_asn_label;
    /** VC客户箱标 carton label url */
    private String vcfba_carton_label;
    /** VC客户 BOL label */
    private String vcfba_bol_label;

    /** 出库委托收件人信息。<br> *注：如果国家是CN（中国），state（省）、city（市）、district（区）必须填写。其他国家state（州）或city（城市）必须填写一个。*/
    @NotNull
    private OconsignmentDesc oconsignment_desc;
    /** 收件人证件信息 */
    private IdentityInfo identity_info;
    /** 	出库委托SKU集合。注：单次最大支持100种SKU种类创建，如超出请分批创建。 */
    @NotNull
    private List<OconsignmentSku> oconsignment_sku;
    /** 进口报关类型; 可选值：D3(客户自有税号清关)； D4(非客户自有税号清关) */
    private String icustoms_service;
    /** 出口报关类型; 可选值：D1(客户自行出口报关)； D2(一般贸易【出口退税】)； D5(非一般贸易报关【出口不退税】)； D6(特别监管区手册报关) */
    private String ocustoms_service;
    /** FBA渠道派送ID.*注：请正确填写Shipment ID,如填写有误导致亚马逊拒收，菜鸟不承担任何责任,Shipment ID可以从亚马逊后台获取. */
    private String fba_shipment_id;
    /** 	FBA订单装箱明细集合 */
    private List<OconsignmentFba> oconsignment_fba;

    private String fba_po_no;
    /** FBA箱唛数量 */
    @Max(999)
    private Integer fba_box_code_qty;
    /** 打印托唛标签面数-默认0面，即不打印 0-4面  */
    @Length(max = 8)
    private String pallet_label_qty;
    /** 是否打印超重标签，Y/N, 默认传N，但如果实际超了，接口仍会返回超重标签 */
    @Length(max = 10)
    private String over_weight_label_sign;
    /** FBA超重标签数量 */
    @Max(999)
    private Integer fba_overweight_label_qty;
    /** 拓展字段 */
    @Length(max = 200)
    private String ReferenceNo;
    /** 时间戳,取时间的毫秒数.例如日期2018-07-26,转换成毫秒数为1532592413187. */
    private Long delivery_date;
    /** 对应派送指定时间段code: <br>佐川SAGAWA: CODE/description 01/午前中 12/12:00-14:00 14/14:00-16:00 16/16:00-18:00 04/18:00-21:00
     * <br>YAMATO: CODE/description 08/8時-12時 14/14時-16時 16/16時-18時 18/18時-20時 19/19時-21時
     * <br>JPPT: CODE/description 51/午前中 52/12-14時 53/14-16時 54/16-18時 55/18-20時 56/20-21時 57/19-21時 */
    private String delivery_timeslot;
    /** 税号（非必填，若无特殊需要不用填写，填写的话会校验当前该SKU的VAT库存数量，导致下单失败） */
    @Length(max = 45)
    private String vat_no;

    /**
     * 	物流服务信息
     */
    @Data
    public static class LogisticsServiceInfo{
        /** 物流产品代码 */
        @NotNull
        private String logistics_product_code;
        /** 退件服务。 <br>可选值：<br>Y(选择退件服务)；<br>N(不选择退件服务)；<br>默认为N。*/
        private String return_service;
        /** 签名服务。 可选值：Y(选择签名服务)；N(不选择签名服务)；默认为N。*/
        private String signature_service;
        /** 选择F，使用菜鸟发货清单；<br>选择C，使用delivery_file透传的文件作为发货清单；<br>当print_delivery选择Y，该字段必填。*/
        private String print_delivery_mode;
        /** 选择Y，则需要打印发货清单，<br>选择N，则不需要打印发货清单。 */
        private String print_delivery;
        /** 客户自定义发货清单，当print_delivery=Y且print_delivery_mode=C时，该字段必填。 特殊物流产品或特殊客户支持传入;系统不接收非指定客户或物流产品传入。
         * <br>*注：只支持PDF格式文件，文件需要转换成Base64编码格式，只支持Base64字符串格式。单个标签文件最大支持1MB。*/
        private String delivery_file;
    }

    /**
     * 出库委托收件人信息
     */
    @Data
    public static class OconsignmentDesc{
        /** 收件人所在国家;国家二字码，详细参考国际二字码 */
        private String country;
        /** 收件人所在州/省 */
        private String state;
        /** 收件人所在城市 */
        private String city;
        /** 收件人所在区/县 */
        private String district;
        /** 收件人的邮编 */
        private String post_code;
        /** 收件人所在街道/详细地址 */
        @Length(max = 256)
        private String street;
        /** 收件人的门牌号 */
        @Length(max = 128)
        private String house_number;
        /** 收件人的公司 */
        private String company;
        /** 收件人姓 */
        private String last_name;
        /** 收件人名 */
        private String first_name;
        /** 收件人的电话号码/手机号 */
        private String phone;
        /** 收件人的Email */
        private String email;
    }

    /**
     *  收件人证件信息
     */
    @Data
    public static class IdentityInfo{
        /** 	收件人证件类型 */
        @Length(max = 50)
        private String id_type;
        /** 	收件人证件号 */
        @Length(max = 50)
        private String id_card;
        /** 收件人证件正面照。<br>*注：文件需要转换成Base64编码格式，只支持Base64字符串格式。 */
        @Length(max = 128)
        private String id_front_pic;
        /** 收件人证件背面照。<br>*注：文件需要转换成Base64编码格式，只支持Base64字符串格式。 */
        @Length(max = 128)
        private String id_back_pic;
    }

    /**
     *  出库委托SKU信息
     */
    @Data
    public static class OconsignmentSku{
        /** 	收件人证件类型 */
        @Length(max = 40)
        @NotNull
        private String sku_code;
        /** 		vc箱唛号与po单号对象数组 */
        private List<CartonNumber> carton_number;
        /** 平台item ID（原item id-TransactionID对接方式可兼容，如：303851111588-1842712222020 ） */
        @Length(max = 40)
        private String item_id;
        /** 	ebay订单transaction_id */
        @Length(max = 60)
        private String transaction_id;
        /**出库SKU数量 */
        @NotNull
        private Integer qty;
        /** SKU库存质量。可选值：G（良好）; B（破损）; R（退件）; C（违禁品）; W（淋湿）; M（霉变）; E（异常）。*注：如果选择是标准出库，SKU的库存质量只能选择良好。*/
       @NotNull
        private String stock_quality;
        /** 批次号;根据SKU是否设置批次号。如果在创建SKU的时候设置了批次管理，则客户必须填写SKU批次号 */
        private String batch_no;
        /** SKU单价 */
        @Length(max = 10)
        private String unit_price;
        /** SKU销售价值单位 */
        @Length(max = 5)
        private String units;
    }

    /**
     * vc箱唛号与po单号对象数组
     */
    @Data
    public static class CartonNumber {
        /** VC 箱唛条码AMZNCC */
        private String carton_code;
        /** VC客户 PO NO */
        private String po_item_code;
        /** VC sku 类型: model/UPC/ASIN */
        private String vcsku_type;
    }

    /**
     * FBA订单装箱明细集合
     */
    @Data
    public static class OconsignmentFba {
        /** FBA箱唛编码 */
        private String fba_box_code;
        /** FBA箱唛编码 */
        private String fba_im_quantity;
        /** 	FBA商品数量 */
        private String fba_im_code;
        /** 	FBA商品编码 */
        private String fba_label_quantity;
        /** FBA商品编码标签打印数量 */
        private String fba_item_label_sign;
        /** 是否贴FBA商品标签标识。可选值：Y（贴FBA标签）; N（不贴FBA标签）; */
        private String fba_inspect_company;
        /** 备注信息1（第一行信息） */
        private String fba_inspect_company_address;
        /** 备注信息2（第二、三行信息） */
        private String fba_inspection_logo;
    }
}
